#include<iostream>

using namespace std;

void process(int& i) {
    cout<<"&"<<i<<endl;
}
void process(int&& i) {
    cout<<"&&"<<i<<endl;
}

// void forward(int &&i) { //unperfect
//     cout<<"forward&&"<<i<<endl;
//     process(i);
// }

//perfect：个人感觉就是通过static_cast进行类型转换，强制指定为右值
/*
static_cast 主要用于以下目的：
    类型转换：将一个类型的值转换为另一个类型。
 ✨避免编译器警告：显式指定类型转换以避免编译器关于**潜在数据丢失**或转换不安全的警告。
    优化代码：通过显式类型转换，编译器可以生成更优化的代码，因为它们了解确切的类型转换。
*/
void forward(typename std::remove_reference<int>::type&& __t) {
    cout<<"forward&&"<< __t<<endl;
    process(static_cast<int&&>(__t));
    return ;
}

int main() {
    int a = 0;
    process(a);//左值
    process(1);//右值
    process(move(a));
    forward(move(a));//unprefectForwarding
    // forward(a); error: no matching function for call to 'forward(int&)

    return 0;
 }